Use case: IRDA receive in DMA mode

This use case shows how to receive IRDA data in DMA mode. In HAL2, IRDA support is handled via the HAL UART driver.

Sequence diagram

    @startuml
    participant "Application" as p1
    participant "HAL IRDA driver" as p2
    participant "DMA" as p3
    participant "DMAx_IRQHandler" as p4

    == initialization and configuration ==
    == IRDA HAL Receive DMA ==
    p1->p2: <color: green> HAL_IRDA_Receive_DMA(&hirda, aRxBuffer, DATA_TO_RECEIVE_SIZE)
    note over p2 #00FF00
    Receiving data ongoing
    end note
    p2->p3: HAL_DMA_Start_IT()
    p3-->p2: HAL_OK
    p2-->p1: HAL_OK

    p4<-: DMAx complete interrupt
    p4->p3: HAL_DMA_IRQHandler
    note over p3 #00FF00
    End of receiving data
    end note
    p3->p2: XferCpltCallback
    p2->p1: HAL_IRDA_RxCpltCallback(hirda->rx_xfer_count)
    @enduml

Code snippet

HAL1

HAL2

#define DATA_TO_RECEIVE_SIZE        255

IRDA_HandleTypeDef hirda;
uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

/* Optional: register receive-complete callback */
HAL_IRDA_RegisterCallback(&hirda, HAL_IRDA_RX_CB_ID, IRDA_RxCpltCallback);

/* Start receive in DMA mode */
(void)HAL_IRDA_Receive_DMA(&hirda, aRxBuffer, DATA_TO_RECEIVE_SIZE);
#define DATA_TO_RECEIVE_SIZE        255

hal_uart_handle_t huart;
uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

/* Optional: register receive-complete callback */
HAL_USART_RegisterRxCpltCallback(&huart, UART_RxCpltCallback);

/* Start receive in DMA mode */
(void)HAL_UART_Receive_DMA(&huart, aRxBuffer, DATA_TO_RECEIVE_SIZE);

Key changes

  1. HAL2 migrates from HAL_IRDA_Receive_DMA() to HAL_UART_Receive_DMA().

  2. HAL2 DMA start helper naming differs (HAL_DMA_StartPeriphXfer_IT_Opt() versus HAL_DMA_Start_IT()).